package com.fdb.efp.nls.service.impl;

import com.fdb.basic.framework.core.base.AbstractFrameworkService;
import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.basic.sequence.service.DefaultPatternDescriptor;
import com.fdb.basic.sequence.service.PatternDescriptor;
import com.fdb.basic.sequence.service.facade.PatternedLimitableSeqService;
import com.fdb.efp.nls.service.dao.AstSysMessageDao;
import com.fdb.efp.nls.service.domain.AstSysMessage;
import com.fdb.efp.nls.service.facade.AstSysMessageService;
import com.fdb.efp.nls.service.vo.AstSysMessageVO;
import com.fdb.efp.nls.service.vo.SDutyVO;
import com.fdb.efp.nls.service.vo.SRoleVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

import static com.fdb.basic.sequence.service.DefaultPatternDescriptor.SEQ;

/**
 * <p>ServiceImpl: 系统公告表				<p>
 *
 * @author fuzm
 * @date 2018-06-07
 */
@Service("astSysMessageService")
public class AstSysMessageServiceImpl extends AbstractFrameworkService implements AstSysMessageService, FrameworkService {

    private static Logger logger = LoggerFactory.getLogger(AstSysMessageServiceImpl.class);
    public static final PatternDescriptor PATTERN = DefaultPatternDescriptor.of("ASM" + SEQ, 10);
    @Autowired
    private AstSysMessageDao astSysMessageDao;
    @Autowired
	private PatternedLimitableSeqService sequenceService;
    /**
     * 新增操作
     */
    public int insertAstSysMessage(AstSysMessageVO inAstSysMessageVo) {
    	logger.debug("当前新增数据为:" + inAstSysMessageVo.toString());
        int num = 0;
        try {
        	//String mesId = this.getSequence("MES_ID");
        	String mesId = sequenceService.getPatternedSequence("MES_ID", PATTERN);
			logger.info("生成流水号为："+mesId);
            String senderId = inAstSysMessageVo.getLoginUserId();
            inAstSysMessageVo.setMesId(mesId);
            inAstSysMessageVo.setSenderId(senderId);
            AstSysMessage astSysMessage = new AstSysMessage();
            beanCopy(inAstSysMessageVo, astSysMessage);
            num = astSysMessageDao.insertAstSysMessage(astSysMessage);
        } catch (Exception e) {
            logger.error("新增数据发生异常!", e);
            num = -1;
        }
        logger.debug("当前新增数据条数为:" + num);
        return num;
    }

    /**
     * 删除操作
     */
    public int deleteByPk(AstSysMessageVO inAstSysMessageVo) {
        logger.debug("当前删除数据条件为:" + inAstSysMessageVo);
        int num = 0;
        try {
            AstSysMessage astSysMessage = new AstSysMessage();
            beanCopy(inAstSysMessageVo, astSysMessage);
            num = astSysMessageDao.deleteByPk(astSysMessage);
        } catch (Exception e) {
            logger.error("删除数据发生异常!", e);
            num = -1;
        }
        logger.debug("根据条件:" + inAstSysMessageVo + "删除的数据条数为" + num);
        return num;
    }


    /**
     * 更新操作
     */
    public int updateByPk(AstSysMessageVO inAstSysMessageVo) {
        logger.debug("当前修改数据为:" + inAstSysMessageVo.toString());
        int num = 0;
        try {
            AstSysMessage astSysMessage = new AstSysMessage();
            beanCopy(inAstSysMessageVo, astSysMessage);
            num = astSysMessageDao.updateByPk(astSysMessage);
        } catch (Exception e) {
            logger.error("修改数据发生异常!", e);
            num = -1;
        }
        logger.debug("根据条件:" + inAstSysMessageVo + "修改的数据条数为" + num);
        return num;
    }

    /**
     * 查询操作
     */
    public AstSysMessageVO queryByPk(AstSysMessageVO inAstSysMessageVo) {

        logger.debug("当前查询参数信息为:" + inAstSysMessageVo);
        try {
            AstSysMessage queryAstSysMessage = new AstSysMessage();
            beanCopy(inAstSysMessageVo, queryAstSysMessage);
            AstSysMessage queryRslAstSysMessage = astSysMessageDao.queryByPk(queryAstSysMessage);
            if (Objects.nonNull(queryRslAstSysMessage)) {
                AstSysMessageVO outAstSysMessageVo = beanCopy(queryRslAstSysMessage, new AstSysMessageVO());
                logger.debug("当前查询结果为:" + outAstSysMessageVo.toString());
                return outAstSysMessageVo;
            } else {
                logger.debug("当前查询结果为空!");
            }
        } catch (Exception e) {
            logger.error("查询数据发生异常!", e);
        }
        return null;
    }


    /**
     * 查询用户权限数据
     */
    @SuppressWarnings("unchecked")
    public List<AstSysMessageVO> queryAllOwner(AstSysMessageVO astSysMessageVo) {

        logger.debug("当前查询本人所属数据信息的参数信息为:");
        List<AstSysMessageVO> list = null;
        try {
            List<AstSysMessage> astSysMessages = astSysMessageDao.queryAllOwnerByPage(astSysMessageVo);
            logger.debug("当前查询本人所属数据信息的结果集数量为:" + astSysMessages.size());
            pageSet(astSysMessages, astSysMessageVo);
            list = (List<AstSysMessageVO>) beansCopy(astSysMessages, AstSysMessageVO.class);
        } catch (Exception e) {
            logger.error("数据转换出现异常!", e);
        }

        return list;

    }


    /**
     * 查询当前机构权限数据
     */
    @SuppressWarnings("unchecked")
    public List<AstSysMessageVO> queryAllCurrOrg(AstSysMessageVO astSysMessageVo) {

        logger.debug("当前查询本人所属机构数据信息的参数信息为:");
        List<AstSysMessage> astSysMessages = astSysMessageDao.queryAllCurrOrgByPage(astSysMessageVo);
        logger.debug("当前查询本人所属机构数据信息的结果集数量为:" + astSysMessages.size());
        List<AstSysMessageVO> list = null;
        try {
            pageSet(astSysMessages, astSysMessageVo);
            list = (List<AstSysMessageVO>) beansCopy(astSysMessages, AstSysMessageVO.class);
        } catch (Exception e) {
            logger.error("数据转换出现异常!", e);
        }

        return list;

    }


    /**
     * 查询当前机构及下属机构权限数据
     */
    @SuppressWarnings("unchecked")
    public List<AstSysMessageVO> queryAllCurrDownOrg(AstSysMessageVO astSysMessageVo) {

        logger.debug("当前查询本人所属机构及以下数据信息的参数信息为:");
        List<AstSysMessage> astSysMessages = astSysMessageDao.queryAllCurrDownOrgByPage(astSysMessageVo);
        logger.debug("当前查询本人所属机构及以下数据信息的结果集数量为:" + astSysMessages.size());
        List<AstSysMessageVO> list = null;
        try {
            pageSet(astSysMessages, astSysMessageVo);
            list = (List<AstSysMessageVO>) beansCopy(astSysMessages, AstSysMessageVO.class);
        } catch (Exception e) {
            logger.error("数据转换出现异常!", e);
        }

        return list;

    }

    /**
     * 查询机构/角色/岗位下的公告
     */
    @SuppressWarnings("unchecked")
    public List<AstSysMessageVO> queryAllCurrOrgByPageToo(AstSysMessageVO astSysMessageVo) {

        logger.debug("当前查询本人所属机构及以下数据信息的参数信息为:");
        List<AstSysMessage> astSysMessages = astSysMessageDao.queryAllCurrOrgByPageToo(astSysMessageVo);
//		if(astSysMessageVo.getOrgIds()==null && astSysMessageVo.getRoleIds()==null && astSysMessageVo.getDutyIds()==null) {
//			//机构/角色/岗位都为空时候返回当前机构所有下属机构
//		}
        logger.debug("当前查询本人所属机构及以下数据信息的结果集数量为:" + astSysMessages.size());
        List<AstSysMessageVO> list = null;
        try {
            pageSet(astSysMessages, astSysMessageVo);
            list = (List<AstSysMessageVO>) beansCopy(astSysMessages, AstSysMessageVO.class);
        } catch (Exception e) {
            logger.error("数据转换出现异常!", e);
        }

        return list;
    }

    /**
     * 返回给首页的不分页公告数据列表
     */
    @SuppressWarnings("unchecked")
    public List<AstSysMessageVO> queryAllCurrOrgView(AstSysMessageVO astSysMessageVo) {
        logger.debug("当前查询本人返回给首页的不分页公告数据列表为:");
        List<AstSysMessageVO> astSysMessagesRole = new ArrayList<>();
        List<AstSysMessageVO> astSysMessagesDuty = new ArrayList<>();
        List<AstSysMessageVO> astSysMessagesOrg;
        AstSysMessageVO org = new AstSysMessageVO();
        org.setOrgIds(astSysMessageVo.getOrgIds());
        astSysMessagesOrg = astSysMessageDao.queryAllCurrOrgView(org);
        AstSysMessageVO role = new AstSysMessageVO();
        for (SRoleVO sRoleVO : astSysMessageVo.getRoleCodes()){
            role.setRoleIds(sRoleVO.getRoleCode());
            astSysMessagesRole.addAll( astSysMessageDao.queryAllCurrOrgView(role));
        }

        AstSysMessageVO duty = new AstSysMessageVO();
        for (SDutyVO sDutyVO : astSysMessageVo.getDutyCodes()) {
            duty.setDutyIds(sDutyVO.getDutyCode());
            astSysMessagesDuty.addAll( astSysMessageDao.queryAllCurrOrgView(duty));
        }

        astSysMessagesOrg.addAll(astSysMessagesRole);
        astSysMessagesOrg.addAll(astSysMessagesDuty);
        Set<AstSysMessageVO> astSysMessageVOSet = new TreeSet<>(Comparator.comparing(AstSysMessageVO::getMesId));
        astSysMessageVOSet.addAll(astSysMessagesOrg);
        astSysMessagesOrg = new ArrayList<>(astSysMessageVOSet);

        /**
         *  过滤机构数据  【2019D0509】【(问题编号)】 @date 2019/12/18
         *  基础功能没明确需求，业务也对此功能表示作用不大，因此简化原功能
        List<AstSysMessageVO> astSysMessagesResult = new ArrayList<>();
        org:for (AstSysMessageVO astSysMessageVO : astSysMessagesOrg) {
            if (StringUtil.isNotEmpty(astSysMessageVO.getOrgIds())){

                //如果角色岗位为空，默认是机构发送全部人
                if (StringUtil.isEmpty(astSysMessageVO.getRoleIds()) && StringUtil.isEmpty(astSysMessageVO.getDutyIds())){
                    astSysMessagesResult.add(astSysMessageVO);
                    continue ;
                }

                //在机构数据中过滤角色
                for (SRoleVO sRoleVO : astSysMessageVo.getRoleCodes()) {
                    //如果匹配当前登陆人的角色，那么就不移除
                    if (StringUtil.isNotEmpty(astSysMessageVO.getRoleIds())){
                        String[] temp = astSysMessageVO.getRoleIds().split(",");
                        for (String s : temp) {
                            if(s.equals(sRoleVO.getRoleCode())) {
                                astSysMessagesResult.add(astSysMessageVO);
                                continue org;
                            }
                        }
                    }
                }
                //在机构数据中过滤岗位
                for (SDutyVO sDutyVO : astSysMessageVo.getDutyCodes()) {
                    //如果匹配当前登陆人的岗位，那么就不移除
                    if (StringUtil.isNotEmpty(sDutyVO.getDutyCode()) ){
                        String[] temp = astSysMessageVO.getDutyIds().split(",");
                        for (String s : temp) {
                            if(s.equals(sDutyVO.getDutyCode())) {
                                astSysMessagesResult.add(astSysMessageVO);
                                continue org;
                            }
                        }
                    }
                }
            }
            else {
                astSysMessagesResult.add(astSysMessageVO);
            }
        }
        List<AstSysMessageVO> list = null;
        try {
            list = (List<AstSysMessageVO>) beansCopy(astSysMessagesResult, AstSysMessageVO.class);
        } catch (Exception e) {
            logger.error("数据转换出现异常!", e);
        } */

        return astSysMessagesOrg;
    }
}
